// Copyright (c) 2009, Philip Tucker
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//     * Redistributions of source code must retain the above copyright
//       notice, this list of conditions and the following disclaimer.
//     * Redistributions in binary form must reproduce the above copyright
//       notice, this list of conditions and the following disclaimer in the
//       documentation and/or other materials provided with the distribution.
//     * Neither the name of the <organization> nor the
//       names of its contributors may be used to endorse or promote products
//       derived from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY Philip Tucker 'AS IS' AND ANY
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL Philip Tucker BE LIABLE FOR ANY
// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
package edu.luc.android;

import java.util.Collections;
import java.util.List;

import android.location.Address;
import android.location.Location;
import android.os.Handler;
import android.os.Message;
import android.util.Log;


/**
 * This class wraps the web-based RESTful API for Google maps search.
 */
public class GoogleLocalSearcher implements LocalSearcher {
  private static final String LOG_ID = GoogleLocalSearcher.class.getSimpleName();

  private final MyMapView mapView;
  private final GoogleSearcher searcher;

  public GoogleLocalSearcher(MyMapView mapView, String apiKey, String referer) {
    this.mapView = mapView;
    this.searcher = new GoogleSearcher(apiKey, referer, mapView.getLocale());
  }

  private class SearchRunnable implements Runnable {

    private final String query;

    private final boolean bounded;

    private final Handler handler;

    public SearchRunnable(String query, boolean bounded, Handler handler) {
      this.query = query;
      this.bounded = bounded;
      this.handler = handler;
    }

    @Override
    public void run() {
      List<Address> addresses = Collections.emptyList();
      try {
        addresses = search(query, bounded);
      } catch (Exception ex) {
        Log.e(LOG_ID, "error searching for: " + query, ex);
      } finally {
        Message msg = Message.obtain(handler);
        msg.obj = addresses;
        handler.sendMessage(msg);
      }
    }
  }

  @Override
  public List<Address> search(String query, boolean bounded) throws Exception {
    if (bounded) {
      Location center = Geo.toLocation(mapView.getMapCenter());
      Location lowerLeft = Geo.toLocation(mapView.getLowerLeft());
      Location upperRight = Geo.toLocation(mapView.getUpperRight());
      return searcher.local(query, center, lowerLeft, upperRight);
    }
    return searcher.local(query, null, null, null);
  }

  @Override
  public void search(String query, boolean bounded, Handler handler)
      throws Exception {
    Log.v(LOG_ID, "search for: " + query);
    SearchRunnable runnable = new SearchRunnable(query, bounded, handler);
    Thread thread = new Thread(runnable, "searching for " + query);
    thread.start();
  }
}
